package com.etalk.crm.dao;

import com.etalk.crm.pojo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author Jordan
 */
@Mapper
public interface WorkflowMapper {

    /**
     * 创建工作流
     * @param record 工作流信息
     * @return 记录数
     */
    int insertWorkflow(WorkflowCreate record);

    /**
     * 修改工作流信息
     * @param record 工作流信息
     * @return
     */
    int updateWorkflow(WorkflowCreate record);

    /**
     * 添加工作流附件
     * @param workflowId 工作流id
     * @param listFiles 附件
     * @return 记录数
     */
    int insertWorkflowFiles(long workflowId, List<String> listFiles);

    /**
     * 删除工作流附件
     * @param workflowId
     * @return
     */
    int deleteWorkflowFiles(long workflowId);

    /**
     * 插入工作流下一节点
     * @param workflowId 工作流id
     * @param processSettingId 工作流下一节点id
     * @return 记录数
     */
    int insertWorkflowApprovalStatus(@Param("workflowId")long workflowId,@Param("processSettingId") int processSettingId);

    /**
     * 添加工作流审批结果
     * @param record 审批信息
     * @return 记录数
     */
    int insertWorkflowApprovalResult(WorkflowApproval record);

    /**
     * 添加审批结果附件
     * @param resultId 审批结果id
     * @param listFiles 审批附件
     * @return 记录数
     */
    int insertWorkflowApprovalResultFiles(@Param("resultId") int resultId,@Param("listFiles") List<String> listFiles);

    /**
     * 更新流程节点信息
     * @param approvalStatusId 流程流动节点id
     * @return
     */
    /**
     * 更新流程节点信息
     * @param approvalStatusId 流程流动节点id
     * @param version 数据版本
     * @param state 更新状态
     * @param userId 更新人id
     * @return
     */
    int updateWorkflowApprovalStatus(@Param("approvalStatusId")int approvalStatusId,@Param("version")int version,@Param("state") int state,@Param("userId")int userId);

    /**
     * 删除审批流程中的审批节点
     * @param workflowId 工作流id
     * @return
     */
    int deleteWorkflowApprovalStatusByWorkflowId(@Param("workflowId") long workflowId);
    /**
     * 标记课程不算老师课时
     * @param workflowId 工作流id
     * @return
     */
    int updateWorkflowCountingClassByWorkflowId(@Param("workflowId") long workflowId);

    /**
     * 标记工作流已完成
     * @param workflowId 工作流id
     * @return
     */
    int updateWorkflowStateById(@Param("workflowId") long workflowId);

    /**
     * 撤回工作流标记
     * @param workflowId 工作流id
     * @return
     */
    int updateWorkflowStateByRevoke(@Param("workflowId") long workflowId);

    /**
     * 重新启动工作流
     * @param workflowId 工作流id
     * @return
     */
    int updateWorkflowStateByResume(@Param("workflowId") long workflowId);

    /**
     * 查询工作流信息
     * @param workflowId 工作流id
     * @return
     */
    WorkflowCreate selectWorkflowById(@Param("workflowId") long workflowId);

    /**
     * 分页查询工作流列表
     * @param record 查询条件
     * @return 记录信息
     */
    List<WorkflowResult> selectWorkflowByPage(WorkflowResult record);

    /**
     * 查询课程中未创建的工作流种类
     * @param lessonId  课程id
     * @return
     */
    List<WorkflowResult> selectWorkflowTypeListByLessonId(@Param("lessonId")int lessonId);

    /**
     * 查询所有的工作流类型
     * @return
     */
    List<WorkflowResult> selectWorkflowTypeList();

    /**
     * 查询工作流问题分类
     * @param processSettingId 工作流id
     * @return
     */
    List<Map<String,Object>> selectWorkflowQuestionTypeList(@Param("processSettingId") int processSettingId);

    /**
     * 查询课程信息
     * @param lessonId 课程id
     * @return 课程信息
     */
    WorkflowCreate selectClassInfoByLessonId(@Param("lessonId") int lessonId);

    /**
     * 查询已审批的结果
     * @param workflowId 工作流id
     * @return
     */
    List<WorkflowApprovalResult> selectApprovalInfo(@Param("workflowId") long workflowId);

    /**
     * 查询工作流原始信息
     * @param workflowId 工作流id
     * @return
     */
    WorkflowCreate selectWorkflowInfoByWorkflowId(@Param("workflowId") long workflowId);

    /**
     * 查询节点需要做的
     * @param approvalId 流程id
     * @return
     */
    ProcessSettingsNode selectWorkflowApprovalNodeInfo(@Param("approvalId") int approvalId);

    /**
     * 查询审批下一节点id
     * @param workflowId 工作流id
     * @return
     */
    Integer selectApprovalNextNode(@Param("workflowId") long workflowId);

    /**
     * 查询工作流当前是否有待审批的节点
     * @param workflowId 工作流id
     * @return
     */
    int selectPendingApprovalByWorkflowId(@Param("workflowId") long workflowId);

}
